home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
boot
/
czesc_2
/
snap
/
clip.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-09-04
|
4KB
|
195 lines
#include "Snap.h"
/* This is just plain clipboard handling */
#include <setjmp.h>
/* alredy defined in Include 2.0
#define ID(a,b,c,d) ((a << 24L) | (b << 16L) | (c << 8L) | (d))
#define ID_CAT ID('C','A','T',' ')
#define ID_FORM ID('F','O','R','M')
#define ID_FTXT ID('F','T','X','T')
#define ID_CHRS ID('C','H','R','S')
*/
#define SAFE(cond, jmp_buf) { if (!(cond)) longjmp(jmp_buf,-1); }
IMPORT struct IOClipReq *ClipReq;
VOID CBFInit(struct CBFHandle *CBFH)
{
if (CBFH->Type == CBFCLIP)
{
CBFH->Handle.ClipReq->io_Error = 0;
CBFH->Handle.ClipReq->io_Offset = 0L;
CBFH->Handle.ClipReq->io_ClipID = 0L;
}
}
VOID CBFEndWrite(struct CBFHandle *CBFH)
{
if (CBFH->Type == CBFCLIP)
{
CBFH->Handle.ClipReq->io_Command = CMD_UPDATE;
DoIO((struct IORequest *)CBFH->Handle.ClipReq);
}
}
VOID CBFEndRead(struct CBFHandle *CBFH)
{
if (CBFH->Type == CBFCLIP)
{
CBFH->Handle.ClipReq->io_Command = CMD_READ;
CBFH->Handle.ClipReq->io_Offset = 2000000000;
CBFH->Handle.ClipReq->io_Length = 1;
CBFH->Handle.ClipReq->io_Data = (STRPTR) 0;
DoIO((struct IORequest *)CBFH->Handle.ClipReq);
}
}
ULONG CBFSeek(struct CBFHandle *CBFH, LONG Offset, LONG Origin)
{
if (CBFH->Type == CBFCLIP)
{
switch (Origin)
{
case OFFSET_CURRENT:
{
CBFH->Handle.ClipReq->io_Offset += Offset;
return CBFH->Handle.ClipReq->io_Offset;
}
case OFFSET_BEGINNING:
{
CBFH->Handle.ClipReq->io_Offset = Offset;
return CBFH->Handle.ClipReq->io_Offset;
}
default:
{
return 2000000000;
}
}
}
else
{
return (ULONG) Seek(CBFH->Handle.File, Offset, Origin);
}
return 0;
}
LONG CBFWrite(struct CBFHandle * CBFH, STRPTR Buf, ULONG BufSize)
{
if (CBFH->Type == CBFCLIP)
{
CBFH->Handle.ClipReq->io_Command = CMD_WRITE;
CBFH->Handle.ClipReq->io_Data = Buf;
CBFH->Handle.ClipReq->io_Length = BufSize;
DoIO((struct IORequest *)CBFH->Handle.ClipReq);
return (CBFH->Handle.ClipReq->io_Error ? -1 : 0);
}
else
{
return Write(CBFH->Handle.File, (char *)Buf, BufSize);
}
}
LONG CBFRead(struct CBFHandle *CBFH, STRPTR Buf, ULONG BufSize)
{
if (CBFH->Type == CBFCLIP)
{
CBFH->Handle.ClipReq->io_Command = CMD_READ;
CBFH->Handle.ClipReq->io_Data = Buf;
CBFH->Handle.ClipReq->io_Length = BufSize;
DoIO((struct IORequest *)CBFH->Handle.ClipReq);
return (CBFH->Handle.ClipReq->io_Error ? -1 : 0);
}
else
{
return Read(CBFH->Handle.File, (char *)Buf, BufSize);
}
}
jmp_buf failure;
VOID SaveClip(UBYTE * SnapSpace, ULONG SnapSize)
{
ULONG Len;
struct CBFHandle CBFH;
CBFH.Type = CBFCLIP;
CBFH.Handle.ClipReq = ClipReq;
CBFInit(&CBFH);
CBFWrite(&CBFH, (STRPTR) "FORM", 4L);
Len = (SnapSize + 13) & ~1;
CBFWrite(&CBFH, (STRPTR) & Len, 4L);
CBFWrite(&CBFH, (STRPTR) "FTXT", 4L);
CBFWrite(&CBFH, (STRPTR) "CHRS", 4L);
Len = SnapSize;
CBFWrite(&CBFH, (STRPTR) & Len, 4L);
CBFWrite(&CBFH, SnapSpace, Len);
if (SnapSize & 1)
{
CBFWrite(&CBFH, (STRPTR) "\0", 1L);
}
CBFEndWrite(&CBFH);
}
struct Snap *FetchClip()
{
struct Snap *Snap = NULL;
ULONG ID[3];
struct CBFHandle CBFH;
WORD done = 0;
CBFH.Type = CBFCLIP;
CBFH.Handle.ClipReq = ClipReq;
if (setjmp(failure))
{
if (Snap)
{
FreeMem(Snap, Snap->Size);
}
CBFEndRead(&CBFH);
return NULL;
}
CBFInit(&CBFH);
SAFE(CBFRead(&CBFH, (STRPTR) & ID[0], 12) != -1L, failure);
if (ID[0] != ID_CAT)
{
CBFSeek(&CBFH, -12, OFFSET_CURRENT);
}
while (!done)
{
SAFE(CBFRead(&CBFH, (STRPTR) & ID[0], 12) != -1L, failure);
switch (ID[2])
{
case ID_FTXT:
{
SAFE(CBFRead(&CBFH, (STRPTR) & ID[0], 8) != -1L, failure);
SAFE(ID[0] == ID_CHRS, failure);
Snap = AllocMem(sizeof (struct Snap) + ID[1],
MEMF_PUBLIC | MEMF_CLEAR);
SAFE(Snap, failure);
Snap->Size = sizeof (struct Snap) + ID[1];
SAFE(CBFRead(&CBFH, (STRPTR) & Snap->Chars[0], Snap->Size) != -1L,
failure);
done = 1;
break;
}
default:
{
SAFE(CBFSeek(&CBFH, ID[1] + (ID[1] & 1) - 4, OFFSET_CURRENT),
failure);
break;
}
}
}
CBFEndRead(&CBFH);
return (Snap);
}